/* ====================================================================
 * 作者-------  支叶认知
 * 创作时间---  20220403
 * 功能-------  语言功能基础定义
 * 运行环境---  长沙思知所提供的自然语运行环境(https://gitee.com/sz-ai/nlurh.git)
 */
//====================================================================
//#pragma once
#ifndef _THIRD_BASICS_
#define _THIRD_BASICS_

#include <stdio.h>
#include <stdint.h>
#include <windows.h>

//==============基础类型定义=<stdint.h>===========================
typedef uint8_t			u8;
typedef uint16_t		u16;
typedef uint32_t   		u32;
//typedef uint64_t   		u64;
//===================C++才能用到的内容===========================================
#ifdef __cplusplus
typedef u16  	cunit;	//字符定义，当前16位宽度

//------布尔三源定义---增加 反向(ANTI)-
#define ANTI  (-1)
/*
typedef enum
{
	FALSE	= 0,
	TRUE	= 1,
	ANTI	=-1,
}BOOL;
*/
//=======数据空间===space============
typedef enum
{
	SPACE_NULL=0,	//无
	SPACE_NAME=1,	//名称
	SPACE_POIT=2,	//指针
	SPACE_SUB=0x08,	//子集 
}SPACE_VAL;

//=======参数类型=========================
typedef enum
{
	TYPE_NULL,	//0 无
	TYPE_NUM,	//1数
	TYPE_DATA,	//2数据
	
	TYPE_FUNC,	//3C函数
	TYPE_SCR,	//4 脚本
	
	TYPE_SEPA,	//5分隔
}TYPE_VAL;
//--------类型值----------------------------
typedef enum
{
	NUM_NULL,
	NUM_BOOL,	//布尔
	NUM_NUM,	//浮点
	NUM_INT,	//整型(有符号10进制)
	NUM_POI,	//地址(无符号16进制)
}TVAL_NUM;

typedef enum
{
	DATA_NULL,
	DATA_BUF,	// 连续数据
	DATA_STR,	// 字符串
}TVAL_DATA;

//=================结构体申明================================
typedef struct _ExpUnit ExpUnit;
typedef struct _ParUnit ParUnit;
//=================函数定义================================
#define FUNC_TYPE_I					1
typedef struct _DefEnv DefEnv,*EnvP;
typedef int(*sz_func_t)(DefEnv *, ExpUnit*&); //函数功能定义(环境参数,输入输出参数) 返回输入参数个数
typedef int(*sz_funp_t)(DefEnv &, ExpUnit*, ExpUnit*, ExpUnit*); //加强型函数功能定义(env,before,after,itself)
//==========连续字符=====================
#ifdef _WIN32 //windows 平台编译控制
#pragma warning(disable : 4200)
#endif
typedef struct
{
	size_t Len;					//参数长度
	union
	{
		u8		pBuf[];	//缓冲字符号(tval==DATA_BUF)
		char	pStr[];		//字符串(tval==DATA_STR)
	};
}DataBufStr;

#if defined(_WIN64) || defined(__LP64__)  //64位定义
typedef double  number_t; //64位系统，双精度定义
//======64位系统数据基源(包括数据与逻辑关系)===============
struct _ExpUnit
{
	u8		space;		//空间类型，{@link SPACE_VAL}
	u8		type;		//参数类型，{@link TYPE_VAL}
	u8		funt;		//功能	，{@link DATA_FUNT}
	u8		tval : 4;		//类型值，{@link DATA_DEFINE_TYPE}
	u8		fval : 4;		//分类

	float	multiple;	//倍数,为SPACE_POIT,SPACE_SUB 时有效果。
	union
	{
		number_t	iNum;	//浮点数值(type==TYPE_NUM && tval==NUM_NUM)
		intptr_t	iVal;	//有符号数值(type==TYPE_NUM && tval==NUM_INT)
		intptr_t	Result;	//返回结果1和0(type==TYPE_NUM && tval==NUM_BOOL)
		void*		uPit;	//无符号数值(type==TYPE_NUM && fval == NUM_POI)
		DataBufStr* pBfS;	//buf字符串(type==TYPE_DATA)
		ExpUnit*	pUNIT;	//子元素或指针 (type==SPACE_POIT)
		cunit* pFs;			//内部执行段：开始地址
		int	iVaA[2];
	};
	union
	{
		cunit*		pFe;	//内部执行段:结束地址
		intptr_t	offset;	//偏移量
		int		iVaB[2];
	};
	ExpUnit* pAttr;	//属性，也可以表关系
	//------------------------------------------------------------
	ExpUnit* pNext;
};
#else
//======32位系统数据基源(包括数据与逻辑关系)===============
typedef float  	number_t;	//64位系统，单精度定义	
struct _ExpUnit
{
	u8		space;		//空间类型，{@link SPACE_VAL}

	u8		type;		//参数类型，{@link TYPE_VAL}
	u8		funt;		//功能	，{@link DATA_FUNT}
	u8		tval : 4;		//类型值，{@link DATA_DEFINE_TYPE}
	u8		fval : 4;		//分类
	union
	{
		number_t	iNum;		//浮点数值(type==TYPE_NUM && tval==NUM_NUM)
		intptr_t	iVal;		//有符号数值(type==TYPE_NUM && tval==NUM_INT)
		intptr_t	Result;		//返回结果1和0(type==TYPE_NUM && tval==NUM_BOOL)
		void*		uPit;		//无符号数值(type==TYPE_NUM && fval == NUM_POI)
		DataBufStr* pBfS;		//buf字符串(type==TYPE_DATA)
		ExpUnit*	pUNIT;		//子元素或指针 (type==SPACE_POIT)
		cunit*		pFs;			//内部执行段：开始地址
	};
	union
	{
		float		multiple;	//倍数,为SPACE_POIT,SPACE_SUB 时有效果。
		cunit*		pFe;		//内部执行段:结束地址
		int			offset;		//偏移量
	};
	ExpUnit* pAttr;	//属性，也可以表关系
	//------------------------------------------------------------
	ExpUnit* pNext;
};
#endif
//====================基本功能(核心仓版本 >= "3.0.0")=================================================
extern const char* sz_get_build_time();
extern void* sz_malloc(size_t len);
extern void* sz_realloc(void* p, size_t len);
extern void sz_free(void* p);
extern ExpUnit* sz_create_unit(void);
extern void sz_clean_unit_data(ExpUnit* pUnit);
extern void sz_free_unit_all(ExpUnit* pStar);
extern void sz_free_curr_and_next(ExpUnit* pStar, int Num);
extern ExpUnit* sz_free_unit(ExpUnit* pStar, int Num);
extern ExpUnit* sz_set_unit_lose(ExpUnit* pStar, int Num);
extern void sz_free_next(ExpUnit* pStar, int Num);
extern void sz_add_next(ExpUnit* pStar, ExpUnit* pAdd);
extern ExpUnit* sz_parsing_unit(ExpUnit* pUNIT);
extern intptr_t sz_get_unit_result(ExpUnit* pUNIT);
extern void sz_put_unit(char* pTitle, u8 NoSpace, ExpUnit* pUnit);
extern int sz_str_run(EnvP pEnv, const char* pStrFun, ExpUnit* par);
extern DataBufStr* sz_read_file(const char* pathName);
extern intptr_t sz_save_file(const char* pathName, DataBufStr* pBfS);
extern int sz_input(const char* title, char* pOut, int oSize);
//------------Tcp---------------------------------------------------
extern int sz_tcp_connect(const char* host, const char* port, int proto);
extern int sz_tcp_send(int fd, const unsigned char* buf, size_t len);
extern int sz_tcp_recv(int fd, unsigned char* buf, size_t len);
extern int sz_tcp_recvto(int fd, unsigned char* buf, size_t len, u32 timeout);
extern int sz_tcp_bind(const char* bind_ip, const char* port, int proto);
extern int sz_tcp_accept(int* bind_fd, int* client_fd, void* client_ip, size_t buf_size, size_t* ip_len);
extern void sz_tcp_free(int fd);
//-----------------------NET---（proto:0为TCP，1为UDP，|0x10为SSL）-------------------------------------------
typedef struct _NetCtx NetCtx;
extern NetCtx* sz_net_connect(const char* pHost, const char* pPort, int proto);
extern int sz_net_send(NetCtx* pNet, char* pIn, int iLen);
extern int sz_net_recv(NetCtx* pNet, char* pOut, int oSize, int timeOutMs);
extern int sz_net_disconnect(NetCtx* pNet);
//==========================I型函数对应结构================================================
typedef struct
{
	const char*	pFunName;		//函数名，对外名称
	const sz_func_t	pFunExp;	//处理功能
}SzFuncEntryI;

typedef struct
{
	u16	type,Priority;			//类型+优先级
	u32	ver;					//接口版本
	const char* ArrayName;		//组名（当存在时，接口访问为：ArrayName.pFunName)
	const SzFuncEntryI ArrayI[];	//以NULL结束
}SzFuncTable;
//==========================对外总结构定义===============================
typedef struct
{
	const char* Info;			//开发者信息
	const char* certificate;	//开发者授权证书(未注册无证书为NULL)
	const SzFuncTable* gAll[];	//以NULL结束
}SzImportSystem;
#endif
//======================日志输出=================================================
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
	LOG_DEBUG, //显示调试信息
	LOG_INFO, //显示提示信息
	LOG_WARN, //显示警告信息
	LOG_ERROR, //显示错误信息
} LOG_T;
typedef void (*sz_log_func_t)(LOG_T level, const char* fmt, ...);
typedef void (*sz_log_hex_func_t)(LOG_T level, const char* msg, void* buf, int len);
extern sz_log_func_t sz_OsLog;
extern sz_log_hex_func_t sz_OsLogHex;
#ifdef __cplusplus
}
#endif
//--------sz_OsLog 与 sz_OsLogHex 输出末端有换行-----------------------------------
/*
#define SZ_LOG(t,...) \
    do { \
        if (sz_OsLog) sz_OsLog(t, ##__VA_ARGS__); \
    } while(0)
#define SZ_LOG_HEX(t,msg,pBuf,Len) \
    do { \
        if (sz_OsLogHex) sz_OsLogHex(t,msg,pBuf,Len); \
    } while(0)
*/
#define SZ_LOG(t,...)					if(sz_OsLog) sz_OsLog(t, __VA_ARGS__)
#define SZ_LOG_HEX(t,msg,pBuf,Len)		if(sz_OsLogHex) sz_OsLogHex(t,msg,pBuf,Len)  
//#define SZ_LOG(t,...)					sz_OsLog(t, ##__VA_ARGS__)
//#define SZ_LOG_HEX(t,msg,pBuf,Len)		sz_OsLogHex(t,msg,pBuf,Len)
#define LG(...)							SZ_LOG(LOG_INFO, __VA_ARGS__)
#define LG_HEX(msg,pBuf,Len)			SZ_LOG_HEX(LOG_INFO,msg,pBuf,Len)

#endif
